#include "AccesoDatos.h"
#include "Comun.h"

AccesoDatos::AccesoDatos() {
	mi_mundo = NULL;
	ruta_archivo = RUTA_XML_DEFECTO;
}

AccesoDatos::~AccesoDatos() {
	if (mi_mundo != NULL) {
		delete mi_mundo;
	}
}

void AccesoDatos::setRutaArchivoXML(const std::string &ruta) {
	ruta_archivo = ruta;
}

void AccesoDatos::guardar(Grabable *aGuardar) {
	if (mi_mundo != NULL) {
		delete mi_mundo;
	}
	mi_mundo = new Mundo;
	aGuardar->guardar(*mi_mundo);
}

void AccesoDatos::cargar(Grabable *aCargar) {
	aCargar->cargar(*mi_mundo);
}

void AccesoDatos::persistir() {
	if (mi_mundo != NULL) {
		ruta_archivo.append("/" + mi_mundo->getNombre() + ".xml");
		descriptor.open(ruta_archivo.c_str(), std::ios_base::out |
				std::ios_base::trunc);
		if (descriptor.is_open()) {
			/* Un problema con el XML, que al guardar doubles los guarda con
			 * coma en lugar de puntos, hace que tengamos que cambiar las
			 * comas por puntos antes de guardar a disco. No pudimos encontrar
			 * la razon o solucion a este problema */
			std::string temp = mi_mundo->aXML();
			size_t posDelimitador = temp.find_first_of(',');
			size_t longString = temp.length();
			while (posDelimitador < longString) {
				temp[posDelimitador] = '.';
				posDelimitador = temp.find_first_of(',', ++posDelimitador);
			}
			descriptor << temp;
			descriptor.close();
		}
	}
}

void AccesoDatos::recuperar() {
	descriptor.open(ruta_archivo.c_str(), std::ios_base::in);
	if (descriptor.is_open()) {
		descriptor.seekg(0, ios::end);
		streamsize longitud = descriptor.tellg();
		descriptor.seekg(0, ios::beg);
		char *buffer = new char [longitud];
		descriptor.read(buffer, longitud);
		std::string textoXML(buffer);
		delete[] buffer;
		if (mi_mundo != NULL) {
			delete mi_mundo;
		}
		mi_mundo = Mundo::crearDeXML(textoXML);
		descriptor.close();
	}
}